package cn.kent.base.falseSharing;

/**
 * 伪共享：
 * TestForContent2 比 TestForContent 性能差
 * 因为： 数组内数组元素的内存地址是连续的，
 *      当访问数组第一个元素时，会把第一个元素后的若干元素一块放入缓存行，这样顺序访问数组时会在缓存中直接命中，因而就不会去读主内存，后续访问亦是
 *      当顺序访问数组时，如果当前元素在缓存中没有命中，将会从主内存一下子读取若干个元素到缓存->一次内存访问可以让后面多次访问直接在缓存中命中。
 *
 *      2跳跃式访问数组的，破坏了程序访问的局部性原则，并且缓存是有容量控制的，缓存满了会根据淘汰算法替换缓存行。
 *
 * 所以： 多线程下并发修改一个缓存行中的多个变量时就会竞争缓存行，从而降低程序的性能。
 *
 * 总结：多线程下访问同一个缓存行的多个变量时才会出现伪共享，单线程下访问同一个缓存行的多个变量反倒能加速程序运行。 本质就是多线程竞争修改同一缓存行，导致降低程序性能。
 *      为后续高级篇 -> LongAddr 奠定基础。
 */
public class TestForContent {
    static final int LINE = 1024;
    static final int COLUMN = 1024;

    public static void main(String[] args) {
        long[][] array = new long[LINE][COLUMN];
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < LINE; i++) {
            for (int j = 0; j < COLUMN; j++) {
                array[i][j] = i * 2 + j;
            }
        }
        long endtime = System.currentTimeMillis();
        long cacheTime = endtime - startTime;
        System.out.println("cache time:"+cacheTime);
    }
}
